package demo;

public class SlidingWindow {

    /**
     * 209. 长度最小的子数组
     * @param target
     * @param nums
     * @return
     */
    public int minSubArrayLen(int target, int[] nums) {
        int ans = Integer.MAX_VALUE, sum = 0;
        for (int left = 0, right = 0; right < nums.length; right++) {
            sum += nums[right];
            while (sum >= target) {
                // 求最小值的滑动窗口和最大值的区别就是统计答案的位置不同
                ans = Math.min(ans, right - left + 1);
                sum -= nums[left++];
            }
        }
        return ans == Integer.MAX_VALUE ? 0 : ans;
    }

    public int demo(int[] nums) {

        // cnt记录临时答案,看情况使用,如果可以直接通过left、right算出答案，则不需要cnt
        int ans = 0, cnt = 0;
        for (int left = 0, right = 0; right < nums.length; right++) {
            // 根据具体情况进行统计统计
            cnt += nums[right];
            // 更新窗口：while某个条件，一直移动left
            while (cnt < right - left) {
                cnt -= nums[left];
                left++;
            }
            ans = Math.max(ans, cnt);
        }
        return ans;
    }
}
